import router from "umi/router"
import authutil from "utils/authutil"
const queryDef = {};
const pathSuffix = true;
const routerDef = {
    /**
     * 跳转页面push
     * @param {路径} pathname 
     * @param {参数-JSON} query 
     * @param {跳转前的钩子函数} onBefore 
     * @param {跳转成功后的钩子函数} onAfter 
     */
    async push(pathObj) {
        if (Object.prototype.toString.call(pathObj) != '[object Object]') {
            //如果不是obj对象，转换为obj
            pathObj = { pathname: pathObj }
        }
        let { pathname, query, onBefore, onAfter } = pathObj;
        if (Object.prototype.toString.call(onBefore) === '[object Function]') {
            //这是一个函数，并执行
            onBefore(query || queryDef);
        }
        //步骤不可交换
        query = await routerDef.getFttQuery(pathname, query);
        pathname = await routerDef.getFttPathname(pathname);
        await router.push({ pathname, query });
        if (Object.prototype.toString.call(onAfter) === '[object Function]') {
            //这是一个函数，并执行
            setTimeout(() => { onAfter(query || queryDef); }, 200)
        }
    },
    /**
     * 跳转页面replace
     * @param {路径} pathname 
     * @param {参数-JSON} query 
     * @param {跳转前的钩子函数} onBefore 
     * @param {跳转成功后的钩子函数} onAfter 
     */
    async replace(pathObj) {
        if (Object.prototype.toString.call(pathObj) != '[object Object]') {
            //如果不是obj对象，转换为obj
            pathObj = { pathname: pathObj }
        }
        let { pathname, query, onBefore, onAfter } = pathObj;
        if (Object.prototype.toString.call(onBefore) === '[object Function]') {
            //这是一个函数，并执行
            onBefore(query || queryDef);
        }
        //步骤不可交换
        query = await routerDef.getFttQuery(pathname, query);
        pathname = await routerDef.getFttPathname(pathname);
        await router.replace({ pathname, query });
        if (Object.prototype.toString.call(onAfter) === '[object Function]') {
            //这是一个函数，并执行
            setTimeout(() => { onAfter(query || queryDef); }, 200)
        }
    },
    /**
     * 跳转页面go
     * @param {返回层级} num 
     * @param {跳转前的钩子函数} onBefore 
     * @param {跳转成功后的钩子函数} onAfter 
     */
    async go(num, onBefore, onAfter) {
        if (Object.prototype.toString.call(onBefore) === '[object Function]') {
            //这是一个函数，并执行
            onBefore();
        }
        await router.go(num);
        if (Object.prototype.toString.call(onAfter) === '[object Function]') {
            //这是一个函数，并执行
            setTimeout(() => { onAfter(); }, 200)
        }
    },
    /**
     * 跳转页面goBack
     * @param {跳转前的钩子函数} onBefore 
     * @param {跳转成功后的钩子函数} onAfter 
     */
    async goBack(onBefore, onAfter) {
        if (Object.prototype.toString.call(onBefore) === '[object Function]') {
            //这是一个函数，并执行
            onBefore();
        }
        await router.goBack();
        if (Object.prototype.toString.call(onAfter) === '[object Function]') {
            //这是一个函数，并执行
            setTimeout(() => { onAfter(); }, 200)
        }
    },
    /**
     * 获取标准格式的pathname
     * @param {*} pathname 
     */
    async getFttPathname(pathname) {
        let path = pathname;
        console.log("router_path====",path)
        if (path) {
            //查询pathname是否含有 "?"
            let argIndex = pathname.indexOf("?");
            if (argIndex != -1) {
                path = pathname.substring(0, argIndex);
            }
            //得到路径最后一个字符串
            let suffix = path.substring(path.length - 1, path.length);
            if (suffix != "/") {
                path = path + "/"
            }
        }
        return path;
    },
    /**
     * 获取标准格式query
     * @param {*} pathname 
     * @param {*} query 
     */
    async getFttQuery(pathname, query) {
        try {
            query = query || {};
            if (Object.prototype.toString.call(query) != '[object Object]') {
                //如果不是obj对象，转换为obj
                query = {}
            }
            let queryParams = await routerDef.getUrlQueryParams(pathname);

            return {
                ...query,
                ...queryParams
            }
        } catch (error) {
            console.log("getFttQuery报错");
            return {};
        }
    },
    /**
     * 获取URL的所有查询参数
     */
    async getUrlQueryParams(url) {
        try {
            let results;
            let params = {};
            let regex = /[\?&]([a-zA-Z_]+)=([\w\-\.]*)/g;
            while ((results = regex.exec(url)) != null) {
                params[results[1]] = results[2];
            }
            return params;
        } catch (error) {
            console.log("getUrlQueryParams参数报错");
            return {};
        }
    },
    /**
     * 首页
     */
    toIndex() {
        routerDef.push("/users/list");
    },
    /**
     * 登录
     */
    toLogin() {
        authutil.delAxiosToken();
        routerDef.push("/auth/login");
    },
    /**
     * 通过节点key值进行路由跳转
     * @param {*} e 
     */
    menuRoute(e) {
        console.log("点击菜单====", e);
        routerDef.push(e.key);
    },
}
export default routerDef;